package intermediate

// 1. 基本函数
fun test() {
    println("I love this")
    println("kotlin")
}

fun say(message: String) {
    println("我爱$message")
}

fun sum(a: Int, b: Int): Int {
    val total = a + b
    println(total)
    return total
}

// 2. 表达式函数（单表达式函数）
fun multiply(a: Int, b: Int) = a * b

// 3. 默认参数函数
fun greet(name: String, greeting: String = "Hello", punctuation: String = "!") {
    println("$greeting, $name$punctuation")
}

// 4. 命名参数函数
fun createUser(name: String, age: Int, email: String) {
    println("User: $name, Age: $age, Email: $email")
}

// 5. 可变参数函数
fun printNumbers(vararg numbers: Int) {
    for (num in numbers) {
        println(num)
    }
}

// 6. 中缀函数
infix fun Int.times(str: String) = str.repeat(this)

// 7. 扩展函数
fun String.addExclamation(): String {
    return this + "!"
}

// 8. 高阶函数（函数作为参数）
fun operate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
    return operation(a, b)
}

// 9. 内联函数
inline fun inlineExample(lambda: () -> Unit) {
    lambda()
}

// 10. 尾递归函数
tailrec fun factorial(n: Long, acc: Long = 1L): Long {
    return if (n <= 1L) acc else factorial(n - 1, acc * n)
}

// 11. 泛型函数
fun <T> printList(list: List<T>) {
    for (item in list) {
        println(item)
    }
}

// 12. 带接收者的函数字面值（apply, let 等）
fun String.processString(): String {
    return this.toUpperCase().substring(0, minOf(this.length, 3))
}

fun main() {
    // 基本函数调用
    test()
    say("zzz")
    sum(4, 5)

    // 表达式函数
    println(multiply(3, 4))

    // 默认参数
    greet("Alice")
    greet("Bob", "Hi")
    greet("Charlie", punctuation = "?")

    // 命名参数
    createUser(name = "John", age = 25, email = "john@example.com")

    // 可变参数
    printNumbers(1, 2, 3, 4, 5)

    // 中缀函数
    println(3 times "Hello ")

    // 扩展函数
    println("hello".addExclamation())

    // 高阶函数
    val result = operate(10, 5) { x, y -> x * y }
    println(result)

    // 内联函数
    inlineExample { println("Inline function called") }

    // 尾递归函数
    println(factorial(5))

    // 泛型函数
    printList(listOf("a", "b", "c"))

    // 带接收者的函数
    println("hello".processString())
}


